package cn.ahaoweb.drule.core.compile.structure;

import cn.ahaoweb.drule.core.compile.enums.ConditionFieldTypeEnum;
import cn.ahaoweb.drule.core.compile.enums.ConditionOperate;
import cn.ahaoweb.drule.core.compile.enums.ConditionRelated;
import cn.ahaoweb.drule.core.model.enums.NodeType;
import cn.ahaoweb.drule.core.model.info.FieldInfo;
import lombok.Data;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * @Name: 单个规则块
 * @Description: 对应于Drools中的rule块
 * @Author: wangzhonghao
 * @Date: 2025/2/7 14:05
 */
@Data
public class DruleBlock implements Serializable {

    /**
     * 规则名称
     */
    private String ruleName;

    /**
     * 备注信息
     */
    private String remark;

    /**
     * 是否开启，默认开启
     */
    private Boolean enabled = true;

    /**
     * 激活组（分组）
     */
    private String activationGroup;

    /**
     * 附加属性
     */
    private Map<String,String> attachProperties;

    /**
     * 条件部分
     */
    private When when;

    /**
     * 结果部分
     */
    private Then then;

    /**
     * 规则条件部分
     */
    @Data
    public static class When implements Serializable{

        /**
         * 外层条件关联关系
         */
        private ConditionRelated related;

        /**
         * 条件集（多个条件组的集合）
         */
        private List<ConditionGroup> groups;
    }

    /**
     * 条件组
     */
    @Data
    public static class ConditionGroup implements Serializable{

        /**
         * 内层条件关联关系
         */
        private ConditionRelated related;

        /**
         * 条件
         */
        private List<Condition> conditions;

    }

    /**
     * 条件
     */
    @Data
    public static class Condition implements Serializable{

        /**
         * 字段信息
         */
        private RuleFieldInfo fieldInfo;

        /**
         * 条件的逻辑运算符
         */
        private ConditionOperate op;

        /**
         * 判断值
         */
        private String judgeValue;


    }

    /**
     * 规则结果部分
     */
    @Data
    public static class Then implements Serializable{

        // 结果集
        private List<Action> actions;

    }

    /**
     * 结果
     */
    @Data
    public static class Action implements Serializable{

        /**
         * 字段信息
         */
        private RuleFieldInfo fieldInfo;

        /**
         * 赋值
         */
        private String value;

    }

    @Data
    public static class RuleFieldInfo implements Serializable{

        /**
         * 字段编码 {@link FieldInfo#getCode()}
         */
        private String fieldCode;

        /**
         * 字段名称 {@link FieldInfo#getName()}
         */
        private String fieldName;

        /**
         * 字段的数据结构 {@link FieldInfo#getFqcn()}
         */
        private String dataType;

        /**
         * 数据类型分类
         */
        private NodeType kind;

        /**
         * 字段类型
         */
        private ConditionFieldTypeEnum type;

        /**
         * 字段路径 {@link FieldInfo#getPath()}
         */
        private String path;

    }

}
